package br.usp.ime.ingpos.testes.modelo;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

import br.usp.ime.ingpos.modelo.Candidato;
import br.usp.ime.ingpos.modelo.Curriculo;
import br.usp.ime.ingpos.modelo.DadosPessoais;
import br.usp.ime.ingpos.modelo.Inscricao;
import br.usp.ime.ingpos.modelo.Usuario;
import br.usp.ime.ingpos.modelo.dao.CandidatoDAO;
import br.usp.ime.ingpos.modelo.dao.UsuarioDao;
import br.usp.ime.ingpos.testes.BancoDeDadosTestCase;
import br.usp.ime.ingpos.testes.services.RegistroNovoUsuarioServiceTeste;

public class CandidatoTeste extends BancoDeDadosTestCase {
	public CandidatoTeste(String name) {
		super(name);
	}

	private UsuarioDao usuarioDao;
	private Usuario usuario1;
	private CandidatoDAO candidatoDao;
	private Candidato candidato;

	private Usuario usuario2;

	private Usuario[] usuarios;

	@Before
	protected void setUp() throws Exception {
		super.setUp();

		usuarios = new Usuario[10];

		usuarioDao = new UsuarioDao(getSessionCreator());
		usuario1 = usuarioDao
				.procurarPorEmail(RegistroNovoUsuarioServiceTeste.EMAIL);
		usuario2 = usuarioDao
				.procurarPorEmail(RegistroNovoUsuarioServiceTeste.EMAIL2);

		for (int i = 0; i < 10; i++) {
			StringBuilder email = new StringBuilder("aluno").append(i).append(
					"@ime.usp.br");

			usuarios[i] = usuarioDao.procurarPorEmail(email.toString());

			assertNotNull(usuarios[i]);
		}

		candidatoDao = new CandidatoDAO(getSessionCreator());
		assertNotNull(usuario1);
		assertNotNull(usuario2);
		assertNotNull(candidatoDao);
	}

	@Test
	public void testCriarOuAtualizarCandidato() {
		criaOuAtualizaCandidato(usuario1);
		criaOuAtualizaCandidato(usuario2);

		for (int i = 0; i < 10; i++) {
			criaOuAtualizaCandidato(usuarios[i]);
		}
	}

	private void criaOuAtualizaCandidato(Usuario usuario) {
		assertNotNull(usuario);
		try {
			candidato = (Candidato) usuario;
		} catch (ClassCastException e) {
			candidato = new Candidato(usuario);
		}

		candidatoDao.saveOrUpdate(candidato);

		assertTrue(candidato.getUsuarioID() > 0);
	}

	@Test
	public void testCandidato () {
		Usuario usuario = new Usuario();
		Curriculo curriculo = new Curriculo();
		DadosPessoais dados = new DadosPessoais();
		DadosPessoais dados2 = new DadosPessoais();
		String email = "fake@fake.com";
		String hash = "fjhsajfajhsfa";
		Set <Inscricao> inscricoes = new HashSet<Inscricao>();
		Inscricao inscricao1 = new Inscricao();
		Inscricao inscricao2 = new Inscricao();
		Inscricao inscricao3 = new Inscricao();

		inscricoes.add(inscricao1);
		inscricoes.add(inscricao2);
		
		usuario.setDadosPessoais(dados);
		
		Candidato candidato = new Candidato(usuario);
		assertNotNull(candidato);
		
		candidato.setCurriculo(curriculo);
		assertEquals(curriculo, candidato.getCurriculo());
		
		assertEquals(dados, candidato.getDadosPessoais());
		
		candidato.setDadosPessoais(dados2);
		assertEquals(dados2, candidato.getDadosPessoais());
		
		candidato.setEmail(email );
		assertEquals(email, candidato.getEmail());
		
		candidato.setHash(hash );
		assertEquals(hash, candidato.getHash());
		
		candidato.setInscricoes(inscricoes);
		Set <Inscricao> inscricoesRes = candidato.getInscricoes();
		assertNotNull(inscricoesRes);
		assertTrue (inscricoesRes.size() == 2);
		assertEquals (inscricoesRes, inscricoes);
		
		candidato.setInscricoes(null);
		candidato.insereInscricao(inscricao3);
		assertTrue(candidato.getInscricoes().size() == 1);
	}
}
